import geopandas as gpd
import pandas as pd
import folium
from folium import Choropleth

# 读取日本地图数据
japan_map = gpd.read_file("japan.geojson")

# 读取吸烟人数数据
smoking_df = pd.read_excel("smoke_pop.xlsx")

# 将数据转换为适合的格式
smoking_pivot = smoking_df.pivot_table(index='area', columns='sex', values='pop', aggfunc='sum').reset_index()
smoking_pivot.columns.name = None  # 去掉列名

# 重命名以符合 `nam_ja`
name_mapping = {
    '北海道': '北海道',
    '青森': '青森県',
    '岩手': '岩手県',
    '宮城': '宮城県',
    '秋田': '秋田県',
    '山形': '山形県',
    '福島': '福島県',
    '茨城': '茨城県',
    '栃木': '栃木県',
    '群馬': '群馬県',
    '埼玉': '埼玉県',
    '千葉': '千葉県',
    '東京': '東京都',
    '神奈川': '神奈川県',
    '新潟': '新潟県',
    '富山': '富山県',
    '石川': '石川県',
    '福井': '福井県',
    '山梨': '山梨県',
    '長野': '長野県',
    '岐阜': '岐阜県',
    '静岡': '静岡県',
    '愛知': '愛知県',
    '三重': '三重県',
    '滋賀': '滋賀県',
    '京都': '京都府',
    '大阪': '大阪府',
    '兵庫': '兵庫県',
    '奈良': '奈良県',
    '和歌山': '和歌山県',
    '鳥取': '鳥取県',
    '島根': '島根県',
    '岡山': '岡山県',
    '広島': '広島県',
    '山口': '山口県',
    '徳島': '徳島県',
    '香川': '香川県',
    '愛媛': '愛媛県',
    '高知': '高知県',
    '福岡': '福岡県',
    '佐賀': '佐賀県',
    '長崎': '長崎県',
    '熊本': '熊本県',
    '大分': '大分県',
    '宮崎': '宮崎県',
    '鹿児島': '鹿児島県',
    '沖縄': '沖縄県'
}

# 应用映射
smoking_pivot['area'] = smoking_pivot['area'].replace(name_mapping)

# 重命名列
smoking_pivot = smoking_pivot.rename(columns={'男': 'Male_Smoking_Population', '女': 'Female_Smoking_Population'})

# 合并地图数据和吸烟人数数据
merged = japan_map.merge(smoking_pivot, left_on="nam_ja", right_on="area", how="left")

# 打印合并结果
print("合并结果：")
print(merged[['nam_ja', 'area', 'Male_Smoking_Population', 'Female_Smoking_Population']])

# 填充缺失值
merged['Male_Smoking_Population'] = merged['Male_Smoking_Population'].fillna(0)
merged['Female_Smoking_Population'] = merged['Female_Smoking_Population'].fillna(0)

# 创建 Folium 地图
m = folium.Map(location=[36.2048, 138.2529], zoom_start=5)

# 添加男性吸烟人数的色块图层
male_choropleth = Choropleth(
    geo_data=merged.to_json(),
    data=smoking_pivot,
    columns=['area', 'Male_Smoking_Population'],
    key_on='feature.properties.nam_ja',
    fill_color='Blues',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='Male Smoking Population',
    nan_fill_color='white',
    nan_fill_opacity=0.1,
    name='男性吸烟人数'
).add_to(m)

# 添加女性吸烟人数的色块图层
female_choropleth = Choropleth(
    geo_data=merged.to_json(),
    data=smoking_pivot,
    columns=['area', 'Female_Smoking_Population'],
    key_on='feature.properties.nam_ja',
    fill_color='Reds',
    fill_opacity=0.5,
    line_opacity=0.2,
    legend_name='Female Smoking Population',
    nan_fill_color='white',
    nan_fill_opacity=0.1,
    name='女性吸烟人数'
).add_to(m)

# 添加图层控制
folium.LayerControl().add_to(m)

# 直接在地图上添加地名，并在点击时显示吸烟人数
for _, row in merged.iterrows():
    if not row['area'] or pd.isna(row['area']):
        continue
    folium.Marker(
        location=[row.geometry.centroid.y, row.geometry.centroid.x],
        icon=folium.DivIcon(html=f"<div style='font-size: 3pt; color: black;'>{row['area']}</div>"),
        popup=f"{row['area']}<br>男性吸烟人数: {row['Male_Smoking_Population']}<br>女性吸烟人数: {row['Female_Smoking_Population']}"
    ).add_to(m)

# 保存地图为 HTML 文件
m.save('japan_smoking_map.html')
